home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1035 / 1035.xpi / chrome / 1clickweather.jar / content / 1clickweather / js / data / datasource.js next >
Text File  |  2010-01-04  |  7KB  |  255 lines

  1. // ∩┐╜ 2005 The Weather Channel Interactive, Inc.  All Rights Reserved.
  2.  
  3. // handle the obs data
  4.  
  5. var oDataSources = Array();
  6.  
  7. function oDataSourcesStub(){
  8.         
  9.    this.Data = {};
  10.    this.oldData = {};
  11.    this.run = 0;
  12.    this.PanelList = Array();
  13.    this.Timer = null;
  14.    this.Scheduler = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); 
  15.    this.Interval = 10;
  16.    this.XY = Array();
  17.    this.lastUpdate = null;
  18.    this.nextUpdate = null;
  19.  
  20.    this.Id = function(id){
  21.       this.id = id;    // id of the object to associate with the xul interface
  22.    }
  23.  
  24.    this.Url = function(url){
  25.       this.url = url;
  26.       debug('setting url[' + this.id + ']: ' + this.url);
  27.    }
  28.  
  29.    this.getID = function(){
  30.       return(this.id);
  31.    }
  32.  
  33.    // Update() is called periodically to update the data in the object
  34.    this.Update = function(){
  35.  
  36.       if(this.url){
  37.          try{
  38.             debug('data update: ' + this.url);
  39.             // debugLog('data update: ' + this.url);
  40.             
  41.             var xmlRequest = new XMLRequest();
  42.             xmlRequest.setParser(this);
  43.             xmlRequest.setUrl(this.url);
  44.             
  45.             var response = xmlRequest.Get();
  46.         
  47.             this.UpdateTime();
  48.  
  49.             // tracking
  50.             var track = new weather_trackingSystem();
  51.                track.DataPullTracking(); // 17/1 data pull tracking
  52.             
  53.             // this use a internal logic
  54.             track.DailyUpdateTracking(); // Daily tracking
  55.         
  56.          }catch(e){
  57.             debugLog("error in update: " + this.id + " " + e);
  58.          }
  59.       }else if(this.Running){
  60.          debugLog("data update already running: " + this.id);
  61.       }
  62.    }
  63.  
  64.    this.Finish = function(){
  65.           
  66.           debugLog("finished data update: " + this.id);
  67.  
  68.    }
  69.  
  70.    this.Shutdown = function(){
  71.       debugLog("shutdown: " + this.id);
  72.       this.Scheduler.cancel();
  73.    }
  74.  
  75.    this.setInterval = function(i){
  76.       this.Interval = i;
  77.    }
  78.  
  79.    this.Start = function(){
  80.       debug('start: ' + this.url);
  81.       this.Scheduler.initWithCallback(this, (1000 * 60 * this.Interval), Components.interfaces.nsITimer.TYPE_REPEATING_SLACK);
  82.  
  83.    }
  84.  
  85.    this.notify = function(aTimer){
  86. //      debugLog("notify: " + this.id + " " + aTimer.delay);
  87.     
  88.       this.Update();
  89.    }
  90.  
  91.    this.UpdateTime = function(objName){
  92.       var date = new Date();
  93.       var d = new Date(date.getTime() + (1000 * 60 * this.Interval));
  94.       this.nextUpdate = d.toLocaleString();
  95.       this.lastUpdate = date.toLocaleString();
  96.    }
  97.    
  98.  
  99.  
  100.    // if there is an error from he XMLRequestNonBlocking call, call this method
  101.    this.parseError = function(errCode){
  102.       debugLog('parseError: ' + errCode + " " + this.id);
  103. //      GlobalError.Show();
  104.    }
  105.  
  106.    this.Dump = function(asText){
  107.       if(asText){
  108.          return(Dumper(this));
  109.       }else{
  110.          DumperAlert(this);
  111.       }
  112.    }
  113.  
  114.    this.Register = function(panelID){
  115.       this.PanelList.push(panelID);
  116.    }
  117.  
  118.    this.unRegister = function(panelID){
  119.       for(var i in this.PanelList){
  120.          if(this.PanelList[i] == panelID){
  121.             break;
  122.          }
  123.       }
  124.       ToolbarContainers[this.PanelList[i]].Hide();
  125.       this.PanelList.splice(i, 1);
  126.    }
  127.  
  128.    this.iconPath = function(name, type, size){
  129.       try{
  130.          var path = "";
  131.          if(type == "moon"){
  132.                path = GlobalAppConfig.getDataByName(this.id).getMoonPhaseIcons().getBase() + name + '.gif';
  133.          }else{
  134.             if(size == "large"){
  135.                path = GlobalAppConfig.getDataByName(this.id).getWxIcons().getBase() + GlobalAppConfig.getDataByName(this.id).getWxIcons().getLarge() + name + '.png';
  136.             }else{
  137.                path = GlobalAppConfig.getDataByName(this.id).getWxIcons().getBase() + GlobalAppConfig.getDataByName(this.id).getWxIcons().getSmall() + name + '.png';
  138.             }
  139.          }
  140.  
  141.          return(path);
  142.       }catch(e){
  143.          return(null);
  144.       }
  145.    }
  146.  
  147.    this.parseHeader = function(xmlDoc){
  148.       try{
  149.          var xml = xmlDoc.getElementsByTagName('dnam')[0].firstChild.nodeValue;
  150.          if(xml){
  151.             this.Data['dnam'] = xml;
  152.          }
  153.    
  154.          var xml = xmlDoc.getElementsByTagName('suns')[0].firstChild.nodeValue;
  155.          if(xml){
  156.             this.Data['suns'] = xml;
  157.          }
  158.  
  159.          var xml = xmlDoc.getElementsByTagName('tm')[0].firstChild.nodeValue;
  160.          if(xml){
  161.             this.Data['tm'] = xml;
  162.          }
  163.  
  164.          var xml = xmlDoc.getElementsByTagName('ut')[0].firstChild.nodeValue;
  165.          if(xml){
  166.             this.Data['ut'] = xml;
  167.          }
  168.  
  169.          var xml = xmlDoc.getElementsByTagName('ud')[0].firstChild.nodeValue;
  170.          if(xml){
  171.             this.Data['ud'] = xml;
  172.          }
  173.  
  174.          var xml = xmlDoc.getElementsByTagName('us')[0].firstChild.nodeValue;
  175.          if(xml){
  176.             this.Data['us'] = xml;
  177.          }
  178.  
  179.          var xml = xmlDoc.getElementsByTagName('up')[0].firstChild.nodeValue;
  180.          if(xml){
  181.             this.Data['up'] = xml;
  182.          }
  183.  
  184.          var xml = xmlDoc.getElementsByTagName('ur')[0].firstChild.nodeValue;
  185.          if(xml){
  186.             this.Data['ur'] = xml;
  187.          }
  188.  
  189.          var xml = xmlDoc.getElementsByTagName('lsup')[0].firstChild.nodeValue;
  190.          if(xml){
  191.             this.Data['lsup'] = xml;
  192.          }
  193.  
  194.       }
  195.       catch(e){
  196.          debug('header error: ' + this.id + " " + e);
  197.       }
  198.    }
  199.  
  200.    this.getLink = function(index, daynum){
  201.       var linkUrl = GlobalAppConfig.getLinkByID(index).getURL();
  202.       linkUrl = linkUrl.replace(/LOCIDTAG/g, GlobalUserConfig.getAllProfiles().getDefaultProfile().getSetup().getLocation().getLocID());
  203.       if(daynum){
  204.          linkUrl = linkUrl.replace(/DAYNUMTAG/g, daynum);
  205.       }
  206.       return(linkUrl);
  207.    }
  208.  
  209.    this.setScreenXY = function(w, h){
  210.       // we have to locate the tooltip to make sure we don't loose some of it off the screen
  211.       // with severe weather, we have a kink in the way we do location that is different from
  212.       // the global error handler.
  213.  
  214.       // if there is enough space to fill in the tooltip, make it relative to the swa icon,
  215.       // otherwise, force it just on the right side
  216.       try{
  217.          var newXY = Array();
  218.          var xy = ToolbarContainers['Day4'].getScreenXY();
  219.          var swa = ToolbarContainers['SWA'].getScreenXY();
  220.  
  221.          if((xy[0] - swa[0]) > w){
  222.             newXY[0] = swa[0];
  223.          }else{
  224.             newXY[0] = xy[0] - w;
  225.          }
  226.          if(xy[1] < h){
  227.             newXY[1] = xy[1];
  228.          }else{
  229.             newXY[1] = xy[1] - h;
  230.          }
  231.         
  232.          this.XY = newXY;
  233.  
  234.       }catch(e){
  235.          debugLog("error in setting screen location: " + e); 
  236.       }
  237.    }
  238.  
  239. }
  240.  
  241.  
  242. function dataUpdate(id){
  243.     if(typeof(DataContainers[id]) != "undefined"){
  244.         //      debugLog("sending update: " + id);
  245.         var result = DataContainers[id].Update();
  246.         return result;
  247.    }
  248. }
  249.  
  250. jsInclude("chrome://1clickweather/content/js/data/obs.js");
  251. jsInclude("chrome://1clickweather/content/js/data/fcst.js");
  252. jsInclude("chrome://1clickweather/content/js/data/swa.js");
  253.  
  254.  
  255.